package qualomelhor.database;

import javax.persistence.Id;
import qualomelhor.gwt.modules.client.ClientUtils;
import com.googlecode.objectify.annotation.Entity;
import java.io.Serializable;
import java.util.Date;
import java.util.Random;

@Entity
public class Avatar implements Serializable {

		private static final long serialVersionUID = 0;

		public static Avatar getAvatar(String strAv) {
			System.out.println("strAV = " + strAv);
			Avatar av = new Avatar();
			av.setId(Long.parseLong(ClientUtils.lerTag(strAv, "id")));
		    av.setCodParteCabelo(Integer.parseInt(ClientUtils.lerTag(strAv, "cab")));
		    av.setCodParteOlho(Integer.parseInt(ClientUtils.lerTag(strAv, "olho")));
		    av.setCodParteSobrancelha(Integer.parseInt(ClientUtils.lerTag(strAv, "sobran")));
		    av.setCodParteBoca(Integer.parseInt(ClientUtils.lerTag(strAv, "boca")));
		    av.setCodParteRoupa(Integer.parseInt(ClientUtils.lerTag(strAv, "roupa")));
		    av.setCodParteMao(Integer.parseInt(ClientUtils.lerTag(strAv, "mao")));
		    av.setCodParteCheeks(Integer.parseInt(ClientUtils.lerTag(strAv, "cheeks")));

			return av;
		}

		public static enum Roupa {
			ROUPA1(1, 0, -1),
			ROUPA2(2, 0, -1),
			ROUPA3(3, 0, -1),
			ROUPA4(4, 0, -1),
			ROUPA5(5, 0, -2),
			ROUPA6(6, 0, -3),
			ROUPA7(7, 0, 0),
			ROUPA8(8, 0, -2),
			ROUPA9(9, 0, 0),
			ROUPA10(10, 0, 0),
			ROUPA11(11, -23, -1),
			ROUPA12(12, 0, 0),
			ROUPA13(13, 0, 0),
			ROUPA14(14, 0, 0),
			ROUPA15(15, 0, 0),
			ROUPA16(16, 0, 0),
			ROUPA17(17, 0, 0);

			public static Roupa getRoupaPerId(int id) {
				Roupa result = null;
				for (int i = 0; i < Roupa.values().length; i++) {
					if (Roupa.values()[i].getId() == id) {
						result = Roupa.values()[i];
						break;
					}
				}
				return result;
			}

			private Roupa(int idPos, int aditionalTop, int aditionalLeft) {
				id = idPos;
				this.aditionalTop = aditionalTop;
				this.aditionalLeft = aditionalLeft;
			}

			public int getId() {
				return id;
			}

			public int getAditionalLeft() {
				return aditionalLeft;
			}

			public int getAditionalTop() {
				return aditionalTop;
			}

			private int id;
			private int aditionalLeft;
			private int aditionalTop;
		};

		public static enum Olho {
			OLHO1(1, 0),
			OLHO2(2, 0),
			OLHO3(3, 0),
			OLHO4(4, 0),
			OLHO5(5, 0),
			OLHO6(6, 6),
			OLHO7(7, 0),
			OLHO8(8, 0),
			OLHO9(9, 0),
			OLHO10(10, 0),
			OLHO11(11, 0),
			OLHO12(12, 0),
			OLHO13(13, 0);

			public static Olho getOlhoPerId(int id) {
				Olho result = null;
				for (int i = 0; i < Olho.values().length; i++) {
					if (Olho.values()[i].getId() == id) {
						result = Olho.values()[i];
						break;
					}
				}
				return result;
			}

			private Olho(int idPos, int aprox) {
				id = idPos;
				aproximacao = aprox;
			}

			public int getId() {
				return id;
			}

			public int getAproximacaoOlho() {
				return aproximacao;
			}

			private int id;
			private int aproximacao;
		};

		public static enum PosicaoOlhoBoneco {
			OLHO_LADO_DIREITO(1, "_L.png", 1, 1),
			OLHO_LADO_ESQUERDO(2, "_L.png", -1, 1),
			OLHO_ACIMA(3, "_AB.png", 1, -1),
			OLHO_ABAIXO(4, "_AB.png", 1, 1),
			OLHO_DIAGONAL_INF_DIREITA(5, "_LI.png", 1, 1),
			OLHO_DIAGONAL_INF_ESQUERDA(6, "_LI.png", -1, 1),
			OLHO_DIAGONAL_SUP_DIREITA(7, "_LS.png", 1, 1),
			OLHO_DIAGONAL_SUP_ESQUERDA(8, "_LS.png", -1, 1),
			OLHO_CENTRO(9, "_C.png", 1, 1);

			public static PosicaoOlhoBoneco getPosicaoOlhoPerId(int id) {
				PosicaoOlhoBoneco result = null;
				for (int i = 0; i < PosicaoOlhoBoneco.values().length; i++) {
					if (PosicaoOlhoBoneco.values()[i].getId() == id) {
						result = PosicaoOlhoBoneco.values()[i];
						break;
					}
				}
				return result;
			}

			public static PosicaoOlhoBoneco getRandom() {
				Random rand = new Random((new Date()).getTime());
				int randnum = rand.nextInt(PosicaoOlhoBoneco.values().length);
				return PosicaoOlhoBoneco.values()[randnum];
			}

			private PosicaoOlhoBoneco(int idPos, String finalFilename, int fX, int fY) {
				id = idPos;
				arquivo = finalFilename;
				fatorX = fX;
				fatorY = fY;
			}

			public int getId() {
				return id;
			}

			public String getArquivo() {
				return arquivo;
			}

			public int getFatorX() {
				return fatorX;
			}

			public int getFatorY() {
				return fatorY;
			}

			private int id;
			private String arquivo;
			private int fatorX;
			private int fatorY;
		};

		public static enum MovimentoSobrancelha {
			SOBRANCELHA_PARADA					(0, false, 0, false, 0, false, false, 0),
			SOBRANCELHA_DIREITA_ACIMA			(1, true, -4, false, 0, true, false, 100),
			SOBRANCELHA_ESQUERDA_ACIMA			(2, true, -4, false, 0, false, true, 100),
			SOBRANCELHA_AMBAS_ACIMA				(3, true, -4, false, 0, true, true, 100),
			SOBRANCELHA_AMBAS_ABAIXO			(4, true, 3, false, 0, true, true, 50),
			SOBRANCELHA_ROTACAO_BRAVO_AMBAS		(5, true, -2, true, 0.16f, true, true, 200),
			SOBRANCELHA_ROTACAO_BONZINHO_AMBAS	(6, true, 1, true, -0.32f, true, true, 200);

			public static MovimentoSobrancelha getMovimentoSobrancelhaId(int id) {
				MovimentoSobrancelha result = null;
				for (int i = 0; i < MovimentoSobrancelha.values().length; i++) {
					if (MovimentoSobrancelha.values()[i].getId() == id) {
						result = MovimentoSobrancelha.values()[i];
						break;
					}
				}
				return result;
			}

			public static MovimentoSobrancelha getRandom() {
				Random rand = new Random((new Date()).getTime());
				int randnum = rand.nextInt(MovimentoSobrancelha.values().length);
				return MovimentoSobrancelha.values()[randnum];
			}

			private MovimentoSobrancelha(int idPos, boolean move, float distMov, boolean rotac, float rot, boolean D, boolean E, int temp) {
				id = idPos;
				mover = move;
				distanciaMover = distMov;
				rotacionar = rotac;
				rotacao = rot;
				sDireita = D;
				sEsquerda = E;
				tempo = temp;
			}

			public int getId() {
				return id;
			}

			public boolean getMover() {
				return mover;
			}

			public float getDistanciaMover() {
				return distanciaMover;
			}

			public boolean getRotacionar() {
				return rotacionar;
			}

			public float getRotacao() {
				return rotacao;
			}

			public boolean getSDireita() {
				return sDireita;
			}

			public boolean getSEsquerda() {
				return sEsquerda;
			}

			public int getTempo() {
				return tempo;
			}

			private int id;
			private boolean mover;
			private float distanciaMover;
			private boolean rotacionar;
			private float rotacao;
			private boolean sDireita;
			private boolean sEsquerda;
			private int tempo;
		};

		public static enum Cabelo {
			CABELO1(1, 0, 0),
			CABELO2(2, 0, 0),
			CABELO3(3, 0, 0),
			CABELO4(4, 0, 0),
			CABELO5(5, 0, -16),
			CABELO6(6, 0, 0),
			CABELO7(7, 0, 0),
			CABELO8(8, 0, 0),
			CABELO9(9, 0, 0),
			CABELO10(10, -16, -38),
			CABELO11(11, 10, 0),
			CABELO12(12, 0, 0),
			CABELO13(13, 12, 0),
			CABELO14(14, 3, 0),
			CABELO15(15, 14, -5),
			CABELO16(16, 0, 0),
			CABELO17(17, 8, 0),
			CABELO18(18, 8, -6),
			CABELO19(19, 0, -6),
			CABELO20(20, 3, -22);

			public static Cabelo getCabeloPorId(int id) {
				Cabelo result = null;
				for (int i = 0; i < Cabelo.values().length; i++) {
					if (Cabelo.values()[i].getId() == id) {
						result = Cabelo.values()[i];
						break;
					}
				}
				return result;
			}

			private Cabelo(int id, int aditionalTop, int adiciontalLeft) {
				this.id = id;
				this.aditionalTop = aditionalTop;
				this.aditionalLeft = adiciontalLeft;
			}

			public int getId() {
				return id;
			}

			public int getAditionalTop() {
				return aditionalTop;
			}

			public int getAditionalLeft() {
				return aditionalLeft;
			}

			private int id;
			private int aditionalTop;
			private int aditionalLeft;
		};

		public static enum EstiloBoca {
			BOCA1(1),
			BOCA2(2),
			BOCA3(3),
			BOCA4(4),
			BOCA5(5),
			BOCA6(6),
			BOCA7(7),
			BOCA8(8),
			BOCA9(9),
			BOCA10(10),
			BOCA11(11),
			BOCA12(12),
			BOCA13(13);

			public static EstiloBoca getBocaPorId(int id) {
				EstiloBoca result = null;
				for (int i = 0; i < EstiloBoca.values().length; i++) {
					if (EstiloBoca.values()[i].getEstiloId() == id) {
						result = EstiloBoca.values()[i];
						break;
					}
				}
				return result;
			}

			private EstiloBoca(int estId) {
				estiloId = estId;
			}

			public int getEstiloId() {
				return estiloId;
			}

			private int estiloId;
		};

		public static enum Sobrancelha {
			SOBRANCELHA1(1),
			SOBRANCELHA2(2),
			SOBRANCELHA3(3),
			SOBRANCELHA4(4),
			SOBRANCELHA5(5),
			SOBRANCELHA6(6),
			SOBRANCELHA7(7),
			SOBRANCELHA8(8),
			SOBRANCELHA9(9),
			SOBRANCELHA10(10),
			SOBRANCELHA11(11),
			SOBRANCELHA12(12),
			SOBRANCELHA13(13),
			SOBRANCELHA14(14),
			SOBRANCELHA15(15),
			SOBRANCELHA16(16),
			SOBRANCELHA17(17);

			public static Sobrancelha getSobrancelhaPorId(int id) {
				Sobrancelha result = null;
				for (int i = 0; i < Sobrancelha.values().length; i++) {
					if (Sobrancelha.values()[i].getId() == id) {
						result = Sobrancelha.values()[i];
						break;
					}
				}
				return result;
			}

			private Sobrancelha(int id) {
				this.id = id;
			}

			public int getId() {
				return id;
			}

			private int id;
		};

		public static enum Cheeks {
			CHEEKS1(1),
			CHEEKS2(2);

			public static Cheeks getCheeksPorId(int id) {
				Cheeks result = null;
				for (int i = 0; i < Cheeks.values().length; i++) {
					if (Cheeks.values()[i].getId() == id) {
						result = Cheeks.values()[i];
						break;
					}
				}
				return result;
			}

			private Cheeks(int id) {
				this.id = id;
			}

			public int getId() {
				return id;
			}

			private int id;
		};

		public static enum PosicaoBoca {
			ANGUSTIADO(1),
			SURPRESO(2),
			INFELIZ(3),
			SATISFEITO(4),
			INSATISFEITO(5),
			FELIZ(6);

			public static PosicaoBoca getPosicaoBocaPorId(int id) {
				PosicaoBoca result = null;
				for (int i = 0; i < PosicaoBoca.values().length; i++) {
					if (PosicaoBoca.values()[i].getId() == id) {
						result = PosicaoBoca.values()[i];
						break;
					}
				}
				return result;
			}

			public static PosicaoBoca getRandom() {
				Random rand = new Random((new Date()).getTime());
				int randnum = rand.nextInt(PosicaoBoca.values().length);
				return PosicaoBoca.values()[randnum];
			}

			private PosicaoBoca(int id) {
				this.id = id;
			}

			public int getId() {
				return id;
			}

			private int id;
		};

		public static enum ParteCorpo {
			NUM_CABELOS(Cabelo.values().length),
			NUM_OLHOS(Olho.values().length),
			NUM_BOCAS(EstiloBoca.values().length),
			NUM_ROUPAS(Roupa.values().length),
			NUM_SOMBRANCELHAS(Sobrancelha.values().length),
			NUM_MAOS(13),
			NUM_CHEEKS(Cheeks.values().length);

			private ParteCorpo(int numTotalPartes) {
				numPartes = numTotalPartes;
			}

			public int getNumPartes() {
				return numPartes;
			}

			private int numPartes;
		};

	    @Id
	    private Long id;

	    private int codParteCorpo;

	    private int codParteCabelo;

	    private int codParteOlho;
	    
	    private int codParteSobrancelha;

	    private int codParteBoca;

	    private int codParteRoupa;

	    private int codParteMao;

	    private int codParteCheeks;

	    public Avatar() {

	    }

	    public Avatar(int codParteCorpo, int codParteCabelo, int codParteSobrancelha, int codParteOlho, int codParteBoca, int codParteRoupa, int codParteMao, int codParteCheeks) {
	    	this.codParteCorpo = codParteCorpo;
	    	this.codParteCabelo = codParteCabelo;
	    	this.codParteSobrancelha = codParteSobrancelha;
	    	this.codParteOlho = codParteOlho;
	    	System.out.println("codParteBoca = " + codParteBoca);
	    	this.codParteBoca = codParteBoca;
	    	this.codParteRoupa = codParteRoupa;
	    	this.codParteMao = codParteMao;
	    	this.codParteCheeks = codParteCheeks;
	    }

	    public Long getId() { 
	        return id; 
	    } 

	    public int getCodParteCorpo() {
	    	return codParteCorpo;
	    }

	    public int getCodParteCabelo() { 
	        return codParteCabelo;
	    }

	    public int getCodParteSobrancelha() {
	    	return codParteSobrancelha;
	    }

	    public int getCodParteOlho() { 
	        return codParteOlho;
	    }

	    public int getCodParteBoca() { 
	        return codParteBoca;
	    }

	    public int getCodParteRoupa() { 
	        return codParteRoupa;
	    }

	    public int getCodParteMao() {
	    	return codParteMao;
	    }

	    public int getCodParteCheeks() {
	    	return codParteCheeks;
	    }

	    public void setId(Long id) {
	    	this.id = id;
	    }

	    public void setCodParteCorpo(int codParteCorpo) {
	    	this.codParteCorpo = codParteCorpo;
	    }

	    public void setCodParteCabelo(int codParteCabelo) {
	    	this.codParteCabelo = codParteCabelo;
	    }

	    public void setCodParteSobrancelha(int codParteSobrancelha) {
	    	this.codParteSobrancelha = codParteSobrancelha;
	    }

	    public void setCodParteOlho(int codParteOlho) {
	    	this.codParteOlho = codParteOlho;
	    }

	    public void setCodParteBoca(int codParteBoca) {
	    	this.codParteBoca = codParteBoca;
	    }

	    public void setCodParteRoupa(int codParteRoupa) {
	    	this.codParteRoupa = codParteRoupa;
	    }

	    public void setCodParteMao(int codParteMao) {
	    	this.codParteMao = codParteMao;
	    }

	    public void setCodParteCheeks(int codParteCheeks) {
	    	this.codParteCheeks = codParteCheeks;
	    }

	    public String toString() {
	    	String result = "<id>" + id + "</id>"; 

		    result += "<cab>" + codParteCabelo + "</cab>";

		    result += "<olho>" + codParteOlho + "</olho>";
		    
		    result += "<sobran>" + codParteSobrancelha + "</sobran>";

		    result += "<boca>" + codParteBoca + "</boca>";
	    
		    result += "<roupa>" + codParteRoupa + "</roupa>";

		    result += "<mao>" + codParteMao + "</mao>";

		    result += "<cheeks>" + codParteCheeks + "</cheeks>";

		    return result;
	    }
}